"""
主题: 装饰器为被包装函数增加参数
问题: 你想在装饰器中给被包装函数增加额外的参数，但是不能影响这个函数现有的调用规则。
提示 : 
"""

from functools import wraps
import inspect


def optional_debug(func):
    @wraps(func)
    def wrapper(*args, debug=False, **kwargs):
        if debug:
            print('Calling', func.__name__)
        return func(*args, **kwargs)

    return wrapper


@optional_debug
def spam(a, b, c):
    print(a, b, c)

def optional_debug1(func):
    '''被包装函数的函数签名修改'''
    if 'debug' in inspect.getargspec(func).args:
        raise TypeError('debug argument already defined')

    @wraps(func)
    def wrapper(*args, debug=False, **kwargs):
        if debug:
            print('Calling', func.__name__)
        return func(*args, **kwargs)

    sig = inspect.signature(func)
    parms = list(sig.parameters.values())
    parms.append(inspect.Parameter('debug',
                inspect.Parameter.KEYWORD_ONLY,
                default=False))
    wrapper.__signature__ = sig.replace(parameters=parms)
    return wrapper

@optional_debug1
def spam1(a, b, c):
    print(a, b, c)    

def recipe1():
    print(f"{spam(1, 2, 3) = }")
    print(f"{spam(1,2,3, debug=True) = }")

def recipe2():
    print(f"{inspect.signature(spam) = }")
    print(f"{inspect.signature(spam1) = }")

def main():
    print('recipe1'.center(20, '*'))
    recipe1()
    print('recipe2'.center(20, '*'))
    recipe2()

if __name__ == '__main__':
    main()       